/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：太平金科-基础组件封装层-ElasticSearch-缺省实现
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taipingframework.boot.es.conditions.query;

import com.taipingframework.boot.es.conditions.AbstractLambdaWrapper;
import com.taipingframework.boot.es.toolkit.support.SFunction;
import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

public class LambdaUpdateWrapper<T> extends AbstractLambdaWrapper<T, LambdaUpdateWrapper<T>>
        implements Update<LambdaUpdateWrapper<T>, T, SFunction<T, ?>> {

    private String documentId;
    private Map<String, Object> documentMap;

    public String getDocumentId() {
        return documentId;
    }

    public Map<String, Object> getDocumentMap() {
        return documentMap;
    }

    /**
     * 不建议直接 new 该实例，使用 Wrappers.<T>lambdaUpdate()
     */
    public LambdaUpdateWrapper() {
        this.initNeed();
    }

    /**
     * 必要的初始化
     */
    @Override
    protected void initNeed() {
        documentId = StringUtils.EMPTY;
        documentMap = new HashMap<>();

        super.initNeed();
    }

    /**
     * 清空条件
     */
    @Override
    protected void clear() {
        documentId = null;
        documentMap.clear();

        super.clear();
    }

    @Override
    protected void finalize() throws Throwable {
        this.clear();
        super.finalize();
    }

    //region implements Update<Children, T, R>

    /**
     * 更新`字段`的`值`
     *
     * @param column 字段
     * @param val    值
     * @return children
     */
    @Override
    public LambdaUpdateWrapper<T> set(SFunction<T, ?> column, Object val) {
        if (Objects.isNull(column)) {
            return typedThis;
        }

        String fieldName = columnToString(column);
        documentMap.put(fieldName, val);

        return typedThis;
    }

    /**
     * 显式指定`ID字段`的`值`
     *
     * @param val 值
     * @return children
     */
    @Override
    public LambdaUpdateWrapper<T> id(Object val) {
        documentId = String.valueOf(val);

        return typedThis;
    }

    //endregion

}
